# -*- coding:utf-8 -*-
import random

from Apps.DataGeneration.DataGenerationClass.baseDataGeneration import BaseDataGeneration

"""
文本相关
"""


class TextDataGeneration(BaseDataGeneration):
    def __init__(self, *args, **kwargs):
        super(TextDataGeneration, self).__init__(*args, **kwargs)

    def get_word(self, ext_word_list=None):
        """
        生成单个词语。
        :param ext_word_list: 定义一个列表，用列表中的词语 中  选择一个词语
        :return:

        :sample: ext_word_list=['abc', 'def', 'ghi', 'jkl']
        """
        return self.generation.word(ext_word_list=ext_word_list)

    def get_words(self, nb=3, ext_word_list=None, unique=True):
        """
        生成词语列表
        :param nb: 控制生成的词语数量
        :param ext_word_list:定义一个列表，用列表中的词语 中  选择词语
        :param unique:生成的词语，是否唯一
        :return:

        :sample:
        :sample: nb=5
        :sample: nb=5, ext_word_list=['abc', 'def', 'ghi', 'jkl']
        :sample: nb=4, ext_word_list=['abc', 'def', 'ghi', 'jkl'], unique=True
        注意⚠️：开启唯一时，词语数量需要小于等于ext_word_list的个数
        """
        return self.generation.words(nb=nb, ext_word_list=ext_word_list, unique=unique)

    def get_sentence(self, nb_words=6, variable_nb_words=False, ext_word_list=None):
        """
        生成单个句子
        :param nb_words:组成句子的词语个数
        :param variable_nb_words:设置为 False 将包含生成确切的词语数量，设置为“True”(默认值)时，将生成随机数量(+/-40%，最小1)
        :param ext_word_list:定义一个列表，用列表中的词语造句子
        :return:

        :sample: nb_words=10
        :sample: nb_words=10, variable_nb_words=False
        :sample: nb_words=10, ext_word_list=['abc', 'def', 'ghi', 'jkl']
        :sample: nb_words=10, variable_nb_words=True,
                 ext_word_list=['abc', 'def', 'ghi', 'jkl']
        """

        return self.generation.sentence(nb_words=nb_words, variable_nb_words=variable_nb_words,
                                        ext_word_list=ext_word_list)

    def get_sentences(self, nb=3, ext_word_list=None):
        """
        生成句子列表
        :param nb: 列表中 句子数量
        :param ext_word_list:定义一个句子列表，用列表中的句子 中  选择句子
        :return:

        :sample:
        :sample: nb=5
        :sample: nb=5, ext_word_list=['abc', 'def', 'ghi', 'jkl']
        """
        return self.generation.sentences(nb=nb, ext_word_list=ext_word_list)

    def get_paragraph(self, nb_sentences, variable_nb_sentences=True, ext_word_list=None):
        """
        生成一个单个段落。
        :param nb_sentences: 控制段落的句子数
        :param variable_nb_sentences: 设置为 False 将包含生成确切的句子数量，设置为“True”(默认值)时，将生成随机数量(+/-40%，最小1)
        :param ext_word_list: 定义一个列表，用列表中的句子造段落，在底层，|sentence |用于生成句子
        :return:

        :sample: nb_sentences=5
        :sample: nb_sentences=5, variable_nb_sentences=False
        :sample: nb_sentences=5, ext_word_list=['abc', 'def', 'ghi', 'jkl']
        :sample: nb_sentences=5, variable_nb_sentences=False,
                 ext_word_list=['abc', 'def', 'ghi', 'jkl']
        """
        return self.generation.paragraph(nb_sentences=nb_sentences, variable_nb_sentences=variable_nb_sentences,
                                         ext_word_list=ext_word_list)

    def get_paragraphs(self, nb=3, ext_word_list=None):
        """
        生成段落列表
        :param nb:控制列表将包含多少个句子
        :param ext_word_list:定义一个列表，用列表中的词语造句子
        :return:

        :sample: nb=5
        :sample: nb=5, ext_word_list=['abc', 'def', 'ghi', 'jkl']
        """
        return self.generation.paragraphs(nb=nb, ext_word_list=ext_word_list)

    def text(self, args):
        """
                生成文章
                :param max_nb_chars:控制文章的最大字符(大致）
                :param ext_word_list:
                :return:

                :sample: max_nb_chars=160
                :sample: ext_word_list=['abc', 'def', 'ghi', 'jkl']
                """

        max_nb_chars = args.get("max_nb_chars", 30)
        ext_word_list = args.get("ext_word_list")

        def get_text_from_ext_word_list():
            """给了选项值的情况执行这个，因为选项值大于给定字数时，会卡住线程"""
            returnString = ''
            while len(returnString) < max_nb_chars:
                returnString += random.choice(ext_word_list)

            return returnString

        if ext_word_list:
            return get_text_from_ext_word_list()
        return self.generation.text(max_nb_chars=max_nb_chars)

    def texts(self, nb_texts=3, max_nb_chars=10, ext_word_list=None):
        """
        生成文章列表
        :param nb_texts:控制列表将包含多少个文章
        :param max_nb_chars:控制每个文章的最大字符（大致）
        :param ext_word_list:
        :return:

        :sample: nb_texts=5
        :sample: nb_texts=5, max_nb_chars=50
        :sample: nb_texts=5, max_nb_chars=50,
                 ext_word_list=['abc', 'def', 'ghi', 'jkl']
        """
        return self.generation.texts(nb_texts=nb_texts, max_nb_chars=max_nb_chars, ext_word_list=ext_word_list)
